package com.hzit.aop.dao.advice;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

//定义通知
@Aspect
@Component
public class MyAdvice2 {
	/**
	 * 前置通知(Before)：是调用方法之前调用
	 * 后置通知(AfterReturning)：在调用方法之后调用（出现异常不调用 ）
	 * 环绕通知(Around):在调用方法的前后，都会执行
	 * 异常通知(After-Throwing):在方法调用出现异常时执行
	 * 后置通知(After):无论是否出现异常都会调用
	 */
	//1. 定义切入点,方法名就是切入点的名字
	@Pointcut("execution(* com.hzit.aop.dao.impl.*Impl.*(..))")
	public void pc1(){

	}
	@Before("pc1()")                // 前置通知
	public void before(){
		System.out.println("前置通知.");
	}

	@AfterReturning("pc1()")       // 后置通知，出现异常不调用
	public void afterReturning(){
		System.out.println("后置通知，出现异常不调用.");
	}

	@Around("pc1()")              // 环绕通知
	public Object around(ProceedingJoinPoint pjp) throws Throwable{
		System.out.println("环绕通知-前面代码");
		Object proceed = pjp.proceed();
		System.out.println("环绕通知-后面代码");
		return proceed;
	}

	@AfterThrowing("pc1()")      // 后置通知，出现异常才调用
	public void afterThrowing(){
		System.out.println("不得了了，出了异常了！【后置通知】");
	}

	@After("pc1()")             // 后置通知，无论是否有异常都会调用
	public void after(){
		System.out.println("无论是否出现异常，都会调用！【后置通知】");
	}
}